package 四种风格.教学软件;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;

import 四种风格.主程序子程序.demo1;
import 四种风格.事件系统.Main2;
import 四种风格.管道过滤器.Main3;
import 四种风格.面向对象.Main1;

public class GUI extends JFrame {

    private JButton uploadButton; // 上传文件按钮
    private JButton processButton; // 处理文件按钮
    private JButton outputButton; // 选择输出文件按钮

    private JComboBox<String> styleComboBox; // 风格选择下拉框
    private String selectedFilePath; // 选中的输入文件路径
    private String outputFilePath; // 选中的输出文件路径

    private JTextArea fileContentArea; // 显示输入文件内容的文本区域
    private JTextArea fixedfileContentArea; // 显示输出文件内容的文本区域

    private JLabel messageLabel; // 显示处理结果的标签
    private JLabel filePathLabel; // 显示输入文件路径的标签
    private JLabel outputFilePathLabel; // 显示输出文件路径的标签

    private JLabel imageLabel; // 用于展示图片的标签
    private ImageIcon imageIcon; // 图片图标

    public GUI() {
        // 设置窗口属性
        setTitle("软件体系结构教学软件");
        setSize(600, 600); // 增大窗口大小以容纳更大的文本区域
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLayout(new FlowLayout()); // 使用 FlowLayout

        // 创建风格选择下拉框
        String[] styles = { "面向对象风格", "事件系统风格", "主程序子程序风格", "管道过滤器风格" };
        styleComboBox = new JComboBox<>(styles);
        add(styleComboBox);

        // 创建上传文件按钮
        uploadButton = new JButton("上传文件");
        add(uploadButton);

        // 创建选择输出文件按钮
        outputButton = new JButton("选择输出文件");
        add(outputButton);

        // 创建处理文件按钮
        processButton = new JButton("处理文件");
        add(processButton);

        // 创建显示输入文件路径的标签
        filePathLabel = new JLabel("");
        add(filePathLabel);

        // 创建显示输出文件路径的标签
        outputFilePathLabel = new JLabel("");
        add(outputFilePathLabel);

        // 创建显示输入文件内容的文本区域
        fileContentArea = new JTextArea(12, 20); // 增大文本区域 高度和宽度
        fileContentArea.setEditable(false); // 设置为不可编辑
        add(new JScrollPane(fileContentArea)); // 使用滚动面板包裹文本区域

        // 创建显示输出文件内容的文本区域
        fixedfileContentArea = new JTextArea(12, 20); // 增大文本区域 高度和宽度
        fixedfileContentArea.setEditable(false); // 设置为不可编辑
        add(new JScrollPane(fixedfileContentArea)); // 使用滚动面板包裹文本区域

        // 创建消息标签
        messageLabel = new JLabel("");
        add(messageLabel); // 将消息标签移到文本框之后

        // 创建用于展示图片的标签
        imageLabel = new JLabel();
        // imageLabel.setPreferredSize(new Dimension(400, 200)); // 设置图片区域大小
        imageLabel.setHorizontalAlignment(JLabel.CENTER); // 水平居中
        add(imageLabel);

        // 添加风格选择事件，更新图片展示
        styleComboBox.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                displayImage(); // 更新显示的图片
            }
        });

        // 添加上传文件按钮点击事件
        uploadButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                JFileChooser fileChooser = new JFileChooser();
                int returnValue = fileChooser.showOpenDialog(null);
                if (returnValue == JFileChooser.APPROVE_OPTION) {
                    File selectedFile = fileChooser.getSelectedFile();
                    selectedFilePath = selectedFile.getAbsolutePath(); // 获取选中的文件路径
                    filePathLabel.setText("选中的输入文件: " + selectedFilePath); // 显示选中的文件路径

                    // 读取文件内容并显示在文本区域
                    try {
                        String content = new String(Files.readAllBytes(Paths.get(selectedFilePath)));
                        fileContentArea.setText(content);
                    } catch (IOException ex) {
                        fileContentArea.setText("无法读取文件内容.");
                    }
                }
            }
        });

        // 添加选择输出文件按钮点击事件
        outputButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                JFileChooser fileChooser = new JFileChooser();
                fileChooser.setDialogTitle("选择输出文件");
                fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
                int returnValue = fileChooser.showSaveDialog(null);
                if (returnValue == JFileChooser.APPROVE_OPTION) {
                    File selectedFile = fileChooser.getSelectedFile();
                    outputFilePath = selectedFile.getAbsolutePath(); // 获取选中的输出文件路径
                    outputFilePathLabel.setText("选中的输出文件: " + outputFilePath); // 显示选中的输出文件路径
                }
            }
        });

        // 添加处理文件按钮点击事件
        processButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                processFile(selectedFilePath, outputFilePath); // 传入输入和输出文件路径
            }
        });
    }

    // 显示图片的函数
    private void displayImage() {
        try {
            String selectedStyle = (String) styleComboBox.getSelectedItem(); // 获取选择的风格
            String imagePath = ""; // 初始化图片路径

            // 根据选择的风格确定待展示的图片路径
            switch (selectedStyle) {
                case "面向对象风格":
                    imagePath = "src\\四种风格\\面向对象\\面向对象原理图.png"; // 面向对象风格的图片路径
                    break;
                case "事件系统风格":
                    imagePath = "src\\四种风格\\事件系统\\事件系统风格.png"; // 事件系统风格的图片路径
                    break;
                case "主程序子程序风格":
                    imagePath = "src\\四种风格\\主程序子程序\\主程序子程序原理图.png"; // 主程序子程序风格的图片路径
                    break;
                case "管道过滤器风格":
                    imagePath = "src\\四种风格\\管道过滤器\\管道过滤器原理图.png"; // 管道过滤器风格的图片路径
                    break;
            }

            // 创建图标
            imageIcon = new ImageIcon(imagePath); // 从指定路径创建图标

            // 调整图片大小
            Image img = imageIcon.getImage();
            int newWidth = 500; // 目标宽度
            int newHeight = (int) (img.getHeight(null) * (newWidth / (double) img.getWidth(null))); // 等比缩放高度
            img = img.getScaledInstance(newWidth, newHeight, Image.SCALE_SMOOTH); // 缩放图片

            // 将缩放后的图像设置为标签的图标
            imageLabel.setIcon(new ImageIcon(img));
            imageLabel.repaint(); // 刷新标签以显示新图像
        } catch (Exception e) {
            e.printStackTrace(); // 输出错误信息
            imageLabel.setText("无法加载图片: " + e.getMessage()); // 显示错误信息
        }
    }

    private void processFile(String inputFilePath, String outputFilePath) {
        String selectedStyle = (String) styleComboBox.getSelectedItem(); // 获取选择的风格
        if (selectedFilePath != null && !selectedFilePath.isEmpty() && outputFilePath != null
                && !outputFilePath.isEmpty()) {
            if (selectedStyle.equals("面向对象风格")) {
                Main1.main(new String[] { inputFilePath, outputFilePath });
            } else if (selectedStyle.equals("事件系统风格")) {
                Main2.main(new String[] { inputFilePath, outputFilePath });
            } else if (selectedStyle.equals("主程序子程序风格")) {
                demo1.main(new String[] { inputFilePath, outputFilePath });
            } else if (selectedStyle.equals("管道过滤器风格")) {
                try {
                    Main3.main(new String[] { inputFilePath, outputFilePath });
                } catch (IOException e1) {
                    e1.printStackTrace();
                    messageLabel.setText("处理时发生错误.");
                }
            }
            messageLabel.setText("处理成功: " + selectedStyle); // 显示处理成功信息和选择的风格

            // 读取文件内容并显示在文本区域
            try {
                String content = new String(Files.readAllBytes(Paths.get(outputFilePath)));
                fixedfileContentArea.setText(content);
            } catch (IOException ex) {
                fixedfileContentArea.setText("无法读取输出文件内容.");
            }
        } else {
            messageLabel.setText("请上传有效的输入文件并选择输出文件"); // 提示需要输入文本
        }
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            GUI gui = new GUI(); // 创建 GUI 实例
            gui.setVisible(true); // 设置窗口可见
        });
    }
}
